package RapiWeb;

import RapiWeb.Objeto.CampoBD;
import RapiWeb.Objeto.Proyecto;
import Utilidades.Archivo;
import Utilidades.Utilidades;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Clase_Web {

    private String str_NomClase;
    private String str_NomTabla;
    private String str_NomClaseDatos;
    private Proyecto proyecto;
    private Utilidades utilidad = new Utilidades();
    private ArrayList<Componente> lista_Componente;
    private Archivo archivo;
    private JP_Tabla tabla_Componentes;
    private CampoBD camposBD[];

    /**
     * Clase para contruir la pagina web de la capa de presentacion
     * 
     * @param proyecto
     * @param str_NomTabla
     * @param tabla_Componentes 
     */
    public Clase_Web(Proyecto proyecto, String str_NomTabla, JP_Tabla tabla_Componentes) {
        this.proyecto = proyecto;
        this.tabla_Componentes = tabla_Componentes;
        this.lista_Componente = tabla_Componentes.getLista_Componentes();
        this.str_NomClase = proyecto.getStr_ClasePresentacion() + str_NomTabla;
        this.str_NomClaseDatos = proyecto.getStr_ClaseDatos() + str_NomTabla;
        this.str_NomTabla = str_NomTabla;
        m_LeerTabla();
    }

    /**
     * Metodo para leer los datos de la tabla y crear los objetos de CampoBD
     */
    private void m_LeerTabla() {
        String str_NomArchivo = proyecto.getStr_NomProyecto() + "/Tablas/" + str_NomTabla + ".txt";
        archivo = new Archivo();
        archivo.m_LeerMultiTokens(str_NomArchivo, 5, "=");
        camposBD = new CampoBD[archivo.getInt_TotalLineas()];
        for (int i = 0; i < camposBD.length; i++) {
            camposBD[i] = new CampoBD();
            camposBD[i].setStr_NomCampo(archivo.dameLinea_Separada()[i].getStr_Palabras(0));
            camposBD[i].setStr_Tamaño(archivo.dameLinea_Separada()[i].getStr_Palabras(2));
            camposBD[i].setStr_Tipo(archivo.dameLinea_Separada()[i].getStr_Palabras(1));
            camposBD[i].setStr_Nulo(archivo.dameLinea_Separada()[i].getStr_Palabras(3));
            camposBD[i].setStr_Ordenar(archivo.dameLinea_Separada()[i].getStr_Palabras(4));
        }
    }

    /**
     * Metodo para crear encabezado de comentarios del archivo
     *
     * @param descripcion
     * @return str_Comentarios
     */
    public String m_CrearComentarios(String descripcion) {
        String str_Comentarios = "''========================================================\n"
                + "'' Autor: \t\t" + proyecto.getStr_Autor() + "\n"
                + "'' Fecha Creación: \t" + utilidad.dameFecha() + "\n"
                + "'' Descripcion: \t" + descripcion + "\n"
                + "''========================================================\n\n";
        return str_Comentarios;
    }

    /**
     * Metodo para crear la region de los Metodos
     *
     * @return str_Metodos
     */
    private String m_Metodos() {
        String str_Metodos = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            str_Metodos += lista_Componente.get(i).getStr_Metodo() + "\n";
        }
        return str_Metodos;
    }

    /**
     * Metodo para crear la regionn de eventos
     *
     * @return str_Eventos
     */
    private String m_Eventos() {
        String str_Eventos="";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Evento().equals("")) {
                str_Eventos += lista_Componente.get(i).getStr_Evento() + "\n";
            }
        }
        return str_Eventos;
    }

    /**
     * Metodo para crear la clase VB de la nueva pagina web creada
     *
     * @return m_CrearClaseVB
     */
    private String m_CrearClaseVB() {
        String str_VB = "";
        
        archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo VB/Presentacion.vb");
        String str_VariablesBD = m_VariablesBD();
        String str_ParametrosBD = m_ParametrosGuardar();
        String str_Eventos = m_Eventos();
        String str_Metodos = m_Metodos();
        String str_Habilitar = m_Habilitar();
        String str_Verificar = m_VerificarDatos();
        str_VB = archivo.dameContenido();
        str_VB = str_VB.replace("?NomClase", str_NomClase);
        str_VB = str_VB.replace("?NomTabla", str_NomTabla);
        str_VB = str_VB.replace("?NomCapaDatos", str_NomClaseDatos);
        str_VB = str_VB.replace("?VariablesTabla", str_VariablesBD);
        str_VB = str_VB.replace("?ParametrosBD", str_ParametrosBD);
        str_VB = str_VB.replace("?Eventos", str_Eventos);
        str_VB = str_VB.replace("?Metodos", str_Metodos);
        str_VB = str_VB.replace("?Verificar", str_Verificar);
        str_VB = str_VB.replace("?HabilitarCampos",str_Habilitar );
//        System.out.println(archivo.dameContenido());
        return str_VB;
    }

    /**
     * Metodo para crear el archivo ASPX
     *
     * @return str_ASPX
     */
    private String m_CrearClaseASPX() {
        String str_ASPX = "";
        String str_register = "";
        String str_Contenido = "";
        str_register = m_CrearRegisters();
        str_Contenido = tabla_Componentes.m_ObtenerTablaASP();
        archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo/Cascaron.xml");
        str_ASPX = archivo.dameContenido();
        str_ASPX = str_ASPX.replace("?Titulo", str_NomClase);
        str_ASPX = str_ASPX.replace("?NomPagina", str_NomClase);
        str_ASPX = str_ASPX.replace("?Register", str_register);
        str_ASPX = str_ASPX.replace("?Contenido", str_Contenido);
        return str_ASPX;
    }
    
    /**
     * Metodo para crear el archivo JSP
     * @return str_JSP
     */
    private String m_CrearClaseJSP() {
        String str_JSP = "";
        String str_register = "";
        String str_Contenido = "";
        str_register = m_CrearRegisters();
        str_Contenido = tabla_Componentes.m_ObtenerTablaASP();
        archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo/Cascaron.xml");
        str_JSP = archivo.dameContenido();
        str_JSP = str_JSP.replace("?Titulo", str_NomClase);
        str_JSP = str_JSP.replace("?NomPagina", str_NomClase);
        str_JSP = str_JSP.replace("?Register", str_register);
        str_JSP = str_JSP.replace("?Contenido", str_Contenido);
        return str_JSP;
    }

    /**
     * Metodo para generar los archivos necesarios para la pagina web ASPX
     */
    public void m_GenerarWeb() {
        String str_DirArchivo = proyecto.getStr_NomProyecto() + "/Paginas/" + str_NomClase;
        String str_ArchivoASP = str_DirArchivo + "/" + str_NomClase + ".aspx";
        String str_ArchivoVB = str_DirArchivo + "/" + str_NomClase + ".aspx.vb";
        try {
            archivo = new Archivo();
            archivo.m_CrearCarpeta(str_DirArchivo);
            archivo.m_CrearArchivo(str_ArchivoASP);
            archivo.m_CrearArchivo(str_ArchivoVB);

            archivo.m_SobreEscribir(str_ArchivoASP, m_CrearClaseASPX());
            archivo.m_SobreEscribir(str_ArchivoVB, m_CrearClaseVB());

            JOptionPane.showMessageDialog(null,"Pagina Creada "+archivo.dameError());
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Excepcion m_GenerarWeb: "+ ex.getMessage() +archivo.dameError());
            System.out.println("Excepcion m_GenerarWeb: " + ex.getMessage() + " : " + archivo.dameError());
        }
    }
    
    /**
     * Metodo para generar los archivos necesarios para la pagina web JSP
     */
    public void m_GenerarWebJSP() {
        String str_DirArchivo = proyecto.getStr_NomProyecto() + "/Paginas/" + str_NomClase;
        String str_ArchivoASP = str_DirArchivo + "/" + str_NomClase + ".jsp";
        try {
            archivo = new Archivo();
            archivo.m_CrearCarpeta(str_DirArchivo);
            archivo.m_CrearArchivo(str_ArchivoASP);

            archivo.m_SobreEscribir(str_ArchivoASP, m_CrearClaseJSP());

            JOptionPane.showMessageDialog(null,"Pagina Creada "+archivo.dameError());
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Excepcion m_GenerarWeb: "+ ex.getMessage() +archivo.dameError());
            System.out.println("Excepcion m_GenerarWeb: " + ex.getMessage() + " : " + archivo.dameError());
        }
    }

    /**
     * Metoodo para crear los Registers de los componentes agregados en la pagina web
     * 
     * @return str_Registers
     */
    private String m_CrearRegisters() {
        String str_Registers = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Register().equals("null")){
                str_Registers += lista_Componente.get(i).getStr_Register();
            }
        }
        return str_Registers;
    }

    /**
     * Metodo para crear las variables con los nomres de los parametros para los
     * procedimientos de la base de datos
     *
     * @return str_VariablesBD
     */
    private String m_VariablesBD() {
        String str_VariablesBD = "";
        for (int i = 1; i < camposBD.length; i++) {
            str_VariablesBD += "Dim " + proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo() + " As " + camposBD[i].getStr_TipoVB()+"\n\t\t";
        }
        return str_VariablesBD;
    }

    /**
     * Metodo para crear los parametros para los metodos de guardar y modificar
     *
     * @return str_Parametros
     */
    private String m_ParametrosGuardar() {
        String str_Parametros = "";
        for (int i = 1; i < camposBD.length; i++) {
            if (i == camposBD.length - 1) {
                str_Parametros += proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo();
            } else {
                str_Parametros += proyecto.getStr_ParametrosSQL() + camposBD[i].getStr_NomCampo() + ", ";
            }
        }
        return str_Parametros;
    }
    
    /**
     * Metodo para habilitar los componentes de la pagina
     *
     * @return str_Habilitar
     */
    private String m_Habilitar() {
        String str_Habilitar = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Tipo().equals("") && !lista_Componente.get(i).getStr_Tipo().equals("lbl")) {
                str_Habilitar += lista_Componente.get(i).getStr_NomComponente() + ".Enabled=value\n      ";
            }
        }
        return str_Habilitar;
    }

    /**
     * Metodo para crear la parte de verificacion de los datos
     * 
     * @return str_Verificar
     */
    private String m_VerificarDatos() {
        String str_Verificar = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            String tipo=lista_Componente.get(i).getStr_Tipo();
            if (!tipo.equals("") && !tipo.equals("lbl") && !tipo.equals("gdv")) {
                str_Verificar+="str_Mensaje += validar.ValidaCampo("+lista_Componente.get(i).getStr_NomComponente()+", \""+lista_Componente.get(i).getStr_campoBD()+"\")\n";
            }
        }
        return str_Verificar;
    }
}
